55장. 블록 · 파일 · 객체 스토리지의 차이
이 장에서 말하고자 하는 것
ECS 위에 컨테이너를 띄우고 ALB로 받는 흐름까지 만들었다.
다음 질문이 자연스럽게 따라온다.
“데이터를 어디에 저장할까?”
AWS의 저장소는 크게 세 종류로 나뉜다.
- 블록 스토리지
- 파일 스토리지
- 객체 스토리지
이 셋의 차이를 모르고 들어가면 잘못된 자리에 데이터를 둔다.
1. 블록 스토리지 — 디스크처럼
물리 디스크처럼 동작하는 저장소
- 한 번에 한 인스턴스가 마운트
- OS가 파일 시스템(ext4 등) 을 만든다
- 빠르다 — DB에 적합
- 같은 AZ 안에서만 마운트 가능
AWS에서는 EBS 다.
2. 파일 스토리지 — 공유 폴더처럼
여러 서버가 동시에 마운트하는 공유 폴더
- NFS · SMB 프로토콜
- 여러 인스턴스 동시 읽기/쓰기
- AZ 사이에서도 접근 가능
- 블록보다 느리다
AWS에서는 EFS · FSx 다.
3. 객체 스토리지 — HTTP로 접근
파일을 HTTP API로 저장 · 조회하는 저장소
- 마운트하지 않는다
- 폴더 구조가 가짜다 (Prefix)
- 사실상 무제한 용량
- 매우 저렴
- 동시에 N 사람이 GET 가능
AWS에서는 S3 다.
4. 한 표로
| 항목 | 블록 (EBS) | 파일 (EFS) | 객체 (S3) |
|---|---|---|---|
| 접근 | 한 인스턴스 마운트 | 여러 인스턴스 마운트 | HTTP API |
| 적합 | DB · OS 디스크 | 공유 파일 · 미디어 | 정적 자원 · 백업 · 로그 |
| 용량 | 정해진 크기 | 거의 무제한 | 거의 무제한 |
| 속도 | 매우 빠름 | 중간 | 객체 단위 응답 |
| 비용 | 보통 | 비쌈 | 매우 저렴 |
| AZ | 같은 AZ만 | 멀티 AZ | 리전 |
5. 어떻게 고르는가
DB · 인덱스 · 부팅 디스크 → EBS
여러 서버가 공유하는 파일 → EFS
사용자 업로드 · 이미지 · 로그 · 백업 → S3
의심스러우면 S3 부터 본다
6. 컨테이너 시대의 변화
EC2 시대에는 디스크가 자연스러웠다.
컨테이너 시대에는
- 컨테이너는 일회용 → EBS 의존도 줄어듦
- 데이터는 외부 저장소로 → S3 · RDS · DynamoDB 가 표준
- 공유 파일이 필요하면 EFS
컨테이너 안에 영구 데이터를 두지 않는다
7. 우리 서비스에서
[ECS 컨테이너]
├─ 사용자 업로드 → S3
├─ 정적 자원 → S3 (CloudFront로 캐시)
├─ 로그 → CloudWatch / S3
├─ DB → RDS / DynamoDB
└─ 공유 파일 → EFS (필요할 때만)
이 책의 척추는 S3 + RDS + DynamoDB 가 중심이다.
8. 직접 확인해보기 — CLI
# 블록 (EBS)
aws ec2 describe-volumes
# 파일 (EFS)
aws efs describe-file-systems
# 객체 (S3)
aws s3 ls
aws s3 cp ./file.txt s3://my-bucket/file.txt
각자의 인터페이스가 다른 게 그대로 느껴진다.
9. 코드로는 이렇게 생겼다 — Terraform
# 블록
resource "aws_ebs_volume" "data" {
availability_zone = "ap-northeast-2a"
size = 100
type = "gp3"
}
# 파일
resource "aws_efs_file_system" "shared" {
performance_mode = "generalPurpose"
}
# 객체
resource "aws_s3_bucket" "uploads" {
bucket = "msa-uploads"
}
세 종류가 얼마나 다른 자리에 사는지 코드에서도 보인다.
10. 이렇게 쓰면 망한다 — 안티패턴
안티패턴 1. 사용자 업로드를 EBS에 저장한다
EBS는 한 인스턴스에만 붙는다. 스케일링하면 다른 인스턴스에서 그 파일을 못 본다.
업로드는 S3
안티패턴 2. 로그를 컨테이너 안에 쌓는다
컨테이너 죽으면 사라진다.
로그는 CloudWatch / S3
안티패턴 3. EFS를 데이터베이스에 쓴다
NFS는 DB가 요구하는 fsync 동작과 충돌이 난다.
안티패턴 4. S3에 폴더가 있다고 믿는다
a/b/c.txt 는 사실 한 객체 키다. “폴더 이동” 같은 연산이 없다.
11. 한 줄로 정리
블록은 디스크, 파일은 공유 폴더, 객체는 HTTP — 자리가 다른 세 종류다
12. 이 장의 핵심 정리
- 블록(EBS) · 파일(EFS) · 객체(S3) 는 접근 방식 자체가 다르다.
- DB와 OS는 블록, 공유 파일은 파일, 나머지는 거의 다 객체다.
- 컨테이너 시대에는 영구 데이터를 외부 저장소로 옮긴다.
- 의심스러우면 S3가 보통 답이다.
- EFS는 DB나 대량 트랜잭션에는 어울리지 않는다.